#ifndef __GAME2048_H__
#define __GAME2048_H__
#include<stdbool.h>
#include "lvgl/lvgl.h"
#include "lvgl/demos/lv_demos.h"
//#include "my_code/2048/game_ui.h"
#include "lvgl.h"
#include <unistd.h>
int score;
int **p;
// 游戏网格尺寸
#define GRID_SIZE 4
#define TILE_SIZE 100       // 增大格子尺寸以适应480×480区域
#define TILE_GAP 10
#define GRID_PADDING 20      // 增加内边距
extern int game2_ui_requested;
//sextern lv_obj_t* scr;
// 在ui.h中添加
typedef struct {
    lv_obj_t *grid;         // 左侧游戏网格，480*480
    lv_obj_t *score_win;   // 分数窗口
    lv_obj_t *score_label; // 分数标签 
    lv_obj_t *rst_win;   // 重启
    lv_obj_t *exit_win;     //退出
    lv_obj_t *tiles[GRID_SIZE][GRID_SIZE];   // 游戏格子
} GameUI;

typedef struct
{   
    int way;    //标识位。点击是OTH，滑动是其他
    int x;      //只在点击时有意义
    int y;      //只在点击时有意义
    int flag;   //判断是否触发屏幕
    int flag2;
}event;

enum way{OTH,UP,DOWN,LEFT,RIGHT};   //点击，上、下、左、右

event ev;
/*
    rand_2_or_4：分别以90%、10%的概率随机生成2、4
    返回值:
        2或4
*/
int rand_2_or_4();


/*
    rand_empty：从二维数组中选择一个空位
    @p：指向二维数组地址
    返回值:
        有空位返回空位地址，无空位返回null
*/
int *rand_empty(int **p);


/*
    game_start：开始游戏
    返回值:
        指向二维数组的指针
*/
int **game_start();


/*
    game_is_over：判断游戏是否结束
    @p：指向二维数组地址
    返回值:
        游戏结束返回false，游戏未结束返回true
*/
bool game_is_over(int **p);


/*
    up_synthesis:向上合成
    @x:当前判断的格子的行数
    @y:当前判断的格子的列数
    @p:二维数组的地址
*/
void up_synthesis(int x,int y,int **p);


/*
    block_synthesis：方块合成
    @ev:保存滑动方向的结构体
    @p:指向二维数组地址
    返回值：
        修改后的数组地址
*/
int **block_synthesis(event *ev,int **p);


/*
    down_synthesis:向下合成
    @x:当前判断的格子的行数
    @y:当前判断的格子的列数
    @p:二维数组的地址
*/
void down_synthesis(int x,int y,int **p);


/*
    left_synthesis:向左合成
    @x:当前判断的格子的行数
    @y:当前判断的格子的列数
    @p:二维数组的地址
*/
void left_synthesis(int x,int y,int **p);


/*
    right_synthesis:向右合成
    @x:当前判断的格子的行数
    @y:当前判断的格子的列数
    @p:二维数组的地址
*/
void right_synthesis(int x,int y,int **p);

/*
    game_save：存档
    @p:指向二维数组地址
    @score：分数
*/
void game_save(int **p,int score);


/*
    game_read：读档
*/
void game_read(int **p,int *score);







/*
    get_tile_color：根据数字获取对应的背景色
    @value：数字
    返回值：
        相应的颜色
*/
lv_color_t get_tile_color(int value) ;


/*
    print_get_way_cb:获取网格区域滑动方向
*/
void print_get_way_cb(lv_event_t *e);


/*
    rst_cb:重开按钮的回调函数
*/
void rst_cb(lv_event_t *e);


/*
    ui_start：开始菜单
*/
void ui_start();


/*
    rand_empty：从二维数组中选择一个空位
    @p：指向二维数组地址
    返回值:
        有空位返回空位地址，无空位返回null
*/
int *rand_empty(int **p);


/*
    ui_init：初始化游戏ui界面，包括4*4网格、分数栏、重开按钮
*/
void ui_init();


/*
    ui_update:刷新显示
    @p:二维数组指针
*/

void ui_update(int **p);


/*
    show_bmp_fullscreen:显示图片
    @bmp_path：路径
    @w
    @h
*/
void show_bmp_fullscreen(const char *bmp_path,int w,int h);



/*
    hide_bmp_fullscreen：隐藏图片
*/
void hide_bmp_fullscreen();


void button_box(lv_event_t * e);

#endif // UI_H